﻿using SIIE_ERP.BaseDatos;
using SIIE_ERP.BaseDatos.Compras.Transacciones;
using SIIE_ERP.BaseDatos.Ventas.Transacciones;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Xml;
using SIIE_ERP.BaseDatos.Ventas;
using System.Data.OleDb;

namespace Elysium.Demo
{
    /// <summary>
    /// Lógica de interacción para Window1.xaml
    /// </summary>
    public partial class WindowDescarga_Ventas : Elysium.Controls.Window
    {
        int Id_Documento;
        Documentos_Id Type_Documento;
        string RFC;
        string Usuario;

        private byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
            return bytes;
        }

        public WindowDescarga_Ventas(int Id_Documento, Documentos_Id Type_Documento, string RFC, string Usuario)
        {
            InitializeComponent();

            this.Id_Documento = Id_Documento;
            this.Type_Documento = Type_Documento;
            this.RFC = RFC;
            this.Usuario = Usuario;

            this.Hide();

            System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog();
            fbd.Description = "Elija la carpeta donde desea descargar su CFDi";
            System.Windows.Forms.DialogResult result = fbd.ShowDialog();

            if (result == System.Windows.Forms.DialogResult.OK)
            {

                Documento_Ventas Docto = new Documento_Ventas(RFC, Usuario);

                DataTable MiDocto = new DataTable();
                if (Type_Documento.Equals(SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboArrendamientoVentas))
                {
                    Documento_VentasArrendamiento Doct = new Documento_VentasArrendamiento(RFC, Usuario);

                    MiDocto = Doct.Get_Documento_By_Id(Type_Documento, Id_Documento);
                }
                if (Type_Documento.Equals(SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboHonorariosVentas))
                {
                    Documento_VentasHonorarios Doct = new Documento_VentasHonorarios(RFC, Usuario);

                    MiDocto = Doct.Get_Documento_By_Id(Type_Documento, Id_Documento);
                }
                if (!Type_Documento.Equals(SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboHonorariosVentas) && !Type_Documento.Equals(SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboArrendamientoVentas))
                {
                    MiDocto = Docto.Get_Documento_By_Id(Type_Documento, Id_Documento);
                }

                //Cuando sea de arrendamiento o honorarios
                string Mi_Addenta = MiDocto.Rows[0]["XML_Addenda"].ToString();
                string Mi_XML = MiDocto.Rows[0]["XML"].ToString();

                string strFriendlyName = Get_DocNames.Get_Estatus_Desc(this.Type_Documento) + "_" + MiDocto.Rows[0]["Desc_Serie"].ToString() + MiDocto.Rows[0]["Secuencia"].ToString() + "_" + this.RFC;

                //AGREGAMOS ADDENDA
                string s = "";
                int Aux = 0;
                Aux = Mi_XML.IndexOf("</cfdi:Comprobante>");
                s = Mi_XML;

                if (!String.IsNullOrEmpty(Mi_Addenta))
                {
                    if (Mi_Addenta.Contains("<cfdi:Addenda>"))
                    {
                        if (Aux != -1)
                        {
                            s = Mi_XML.Substring(0, Aux);
                            s = s + Mi_Addenta + "</cfdi:Comprobante>";
                        }
                    }
                    else
                    {
                        if (Aux != -1)
                        {
                            s = Mi_XML.Substring(0, Aux);
                            s = s + "<cfdi:Addenda>" + Mi_Addenta + "</cfdi:Addenda></cfdi:Comprobante></cfdi:Comprobante>";
                        }
                    }
                }


                //DESCARGAMOS XML
                string GuidXML = Guid.NewGuid().ToString() + ".xml";
                File.WriteAllBytes(Directory.GetCurrentDirectory() + "\\" + GuidXML, GetBytes(s));
                XmlDocument xdoc = new XmlDocument();
                xdoc.LoadXml(s);
                xdoc.Save(fbd.SelectedPath + "\\" + strFriendlyName + ".xml");

                // WebClient clientXML = new WebClient();
                // clientXML.DownloadFile(new Uri(Directory.GetCurrentDirectory() + "\\" + GuidXML), fbd.SelectedPath + "\\" + strFriendlyName + ".xml");

               
                


                try
                {
                    File.Delete(Directory.GetCurrentDirectory() + "\\" + GuidXML);
                }
                catch (Exception)
                {

                }

                //DECARGAMOS PDF

                Microsoft.Reporting.WinForms.LocalReport report = new Microsoft.Reporting.WinForms.LocalReport();

                Microsoft.Reporting.WinForms.ReportDataSource reportDataSource1 = new Microsoft.Reporting.WinForms.ReportDataSource();
                Microsoft.Reporting.WinForms.ReportDataSource reportDataSource2 = new Microsoft.Reporting.WinForms.ReportDataSource();
                Microsoft.Reporting.WinForms.ReportDataSource reportDataSource3 = new Microsoft.Reporting.WinForms.ReportDataSource();
                Microsoft.Reporting.WinForms.ReportDataSource reportDataSource4 = new Microsoft.Reporting.WinForms.ReportDataSource();
                Microsoft.Reporting.WinForms.ReportDataSource reportDataSource5 = new Microsoft.Reporting.WinForms.ReportDataSource();
                Microsoft.Reporting.WinForms.ReportDataSource reportDataSource6 = new Microsoft.Reporting.WinForms.ReportDataSource();


                SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_Ventas MiDocumento_Ventas = new SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_Ventas(this.RFC, this.Usuario);
                SIIE_ERP.BaseDatos.Configuracion.Empresa.dbo_Cat_Empresa Cat_Empresa = new SIIE_ERP.BaseDatos.Configuracion.Empresa.dbo_Cat_Empresa(this.RFC, this.Usuario);
                SIIE_ERP.BaseDatos.Configuracion.Empresa.dbo_Cat_Empresa_Datos_Factura Cat_Empresa_Datos_Factura = new SIIE_ERP.BaseDatos.Configuracion.Empresa.dbo_Cat_Empresa_Datos_Factura(this.RFC, this.Usuario);

                DataTable dt_Importe = new DataTable();
                dt_Importe.Clear();
                dt_Importe.Columns.Add("Total_Letra");

                DataRow _ravi = dt_Importe.NewRow();
                try
                {
                    _ravi["Total_Letra"] = FuncionesClass.GetNumeroAletras(Double.Parse(MiDocumento_Ventas.Get_Documento_By_Id(Type_Documento, this.Id_Documento).Rows[0]["Total"].ToString())).ToString().ToUpper();

                }
                catch (Exception Ex)
                {
                    _ravi["Total_Letra"] = "";
                }
                dt_Importe.Rows.Add(_ravi);

                if (Type_Documento.Equals(SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboArrendamientoVentas))
                {
                    SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_VentasArrendamiento M = new SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_VentasArrendamiento(this.RFC, this.Usuario);

                    reportDataSource1.Name = "Factura_Cliente"; //Name of the report dataset in our .RDLC file
                    reportDataSource1.Value = M.Get_Report(this.Id_Documento);
                }
                if (Type_Documento.Equals(SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboHonorariosVentas))
                {
                    SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_VentasHonorarios M = new SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_VentasHonorarios(this.RFC, this.Usuario);

                    reportDataSource1.Name = "Factura_Cliente"; //Name of the report dataset in our .RDLC file
                    reportDataSource1.Value = M.Get_Report(this.Id_Documento);
                }
                if (!Type_Documento.Equals(SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboHonorariosVentas) && !Type_Documento.Equals(SIIE_ERP.BaseDatos.Documentos_Id.Doc_ReciboArrendamientoVentas))
                {
                    reportDataSource1.Name = "Factura_Cliente"; //Name of the report dataset in our .RDLC file
                    reportDataSource1.Value = MiDocumento_Ventas.Get_Report(Type_Documento, this.Id_Documento);
                }

                reportDataSource2.Name = "Empresa"; //Name of the report dataset in our .RDLC file
                reportDataSource2.Value = Cat_Empresa.Get_Report();

                reportDataSource3.Name = "Datos_Factura"; //Name of the report dataset in our .RDLC file
                reportDataSource3.Value = Cat_Empresa_Datos_Factura.Get_Empresa_Datos_Factura();


                reportDataSource4.Name = "Importe_Letra"; //Name of the report dataset in our .RDLC file
                reportDataSource4.Value = dt_Importe;

                reportDataSource5.Name = "FE"; //Name of the report dataset in our .RDLC file
                reportDataSource5.Value = MiDocumento_Ventas.Get_Report_CFDi(Type_Documento, this.Id_Documento);

                




                report.DataSources.Add(reportDataSource1);
                report.DataSources.Add(reportDataSource2);
                report.DataSources.Add(reportDataSource3);
                report.DataSources.Add(reportDataSource4);
                report.DataSources.Add(reportDataSource5);




                if (this.Type_Documento == Documentos_Id.Doc_FacturaCliente)
                {
                    reportDataSource6.Name = "Regimen";
                    reportDataSource6.Value = Cat_Empresa_Datos_Factura.Get_Empresa_Regimen();
                    report.DataSources.Add(reportDataSource6);
                    report.ReportPath = "Informes/Reportes/RPT_Factura_Cliente_FE.rdlc";
                }
                else if (this.Type_Documento == Documentos_Id.Doc_NotaCreditoCliente)
                    report.ReportPath = "Informes/Reportes/RPT_Nota_Credito_FE.rdlc";
                else if (this.Type_Documento == Documentos_Id.Doc_ReciboHonorariosVentas)
                    report.ReportPath = "Informes/Reportes/RPT_ReciboHonorarios_Cliente_FE.rdlc";
                else if (this.Type_Documento == Documentos_Id.Doc_ReciboArrendamientoVentas)
                    report.ReportPath = "Informes/Reportes/RPT_ReciboArrendamiento_Cliente_FE.rdlc";
                else if (this.Type_Documento == Documentos_Id.Doc_DevolucionCliente)
                    report.ReportPath = "Informes/Reportes/RPT_Devolucion_Cliente_FE.rdlc";

                string GuidPDF = Guid.NewGuid().ToString() + ".xml";
                File.WriteAllBytes(Directory.GetCurrentDirectory() + "\\" + GuidPDF, report.Render("PDF"));

                try
                {
                    WebClient clientPDF = new WebClient();
                    clientPDF.DownloadFile(new Uri(Directory.GetCurrentDirectory() + "\\" + GuidPDF), fbd.SelectedPath + "\\" + strFriendlyName + ".pdf");

                    File.Delete(Directory.GetCurrentDirectory() + "\\" + clientPDF);
                }
                catch (Exception)
                {
                    MessageBox.Show("Archivos CFDi estan abiertos.");

                    this.Close();
                    return;
                }

                MessageBox.Show("Archivos CFDi descargados correctamente.");
                this.Close();
            }
            else
            {
                MessageBox.Show("Se canceló la descarga de CFDi.");
                this.Close();
            }
        }


      

    }
}
